<?php

/**
 * 自动生成 SysRolePermissionService
 * 
 * Apps/Common/Service/SysRolePermissionService.class.php
 * admin @ 2015-06-18
 */

namespace Common\Service;

class SysRolePermissionService {

  private static $instance;

  const SURER_ADMIN_ROLE_ID = '1';
  
  public static function instance() {
    if (self::$instance == null) {
      $instance = new SysRolePermissionService();
    }

    return $instance;
  }
  
  function get_by_role_id( $role_id ) {
    $SysRolePermission = M('SysRolePermission');
    $data = $SysRolePermission->where('role_id = %d' , $role_id )->select();
    return $data ? $data : array();
  }
  
  function get_by_role_opt( $role_id , $opt_id ) {
    $SysRolePermission = M('SysRolePermission');
    $data = $SysRolePermission->where('role_id = %d and opt_id = %d' , $role_id , $opt_id )->find();
    return $data ? $data : array(); 
  }

  /**
   * 检查角色权限
   * @param type $role_id  //角色名称
   * @param type $opt_name //操作名称
   * @param type $func_name //功能名称
   * @return boolean
   */
  function check_by_role_opt_func( $role_id , $opt_name , $func_url ) {
    if ( $role_id == self::SURER_ADMIN_ROLE_ID ) {
      return TRUE ;
    }
    
    $where = array(
      'srp.role_id' => array('exp' , "in ( $role_id ) ") ,
      'sf.url' => $func_url ,
    );
    
    $SysRolePermission = M('SysRolePermission');
    $data = $SysRolePermission
      ->field('DISTINCT sfo.name')
      ->alias('srp')
      ->join('sys_func_operation sfo ON sfo.id = srp.opt_id')
      ->join('sys_func sf ON sf.id = sfo.func_id')
      ->where( $where ) 
      ->select();
    //echo $SysRolePermission->_sql();
    if ( !$data || empty( $data ) ) {
      return FALSE ;
    }

    $fix_data = array();
    foreach( $data as $row ) {
      $fix_data[] = $row['name'] ;
    }
    
    if ( !in_array($opt_name , $fix_data) ) {
      return FALSE ;
    }

    return $fix_data ; 
  }
    
  function create($data) {
    $SysRolePermission = M('SysRolePermission');
    $ret = $SysRolePermission->add($data);
    if ($ret) {
      return ajax_arr('更新权限成功', TRUE, array(
        'id' => $ret
      ));
    } else {
      return ajax_arr('更新权限失败', FALSE);
    }
  }

  function delete($ids) {
    $SysRolePermission = M('SysRolePermission');
    $ret = $SysRolePermission->delete($ids);
    if ($ret == 0) {
      return ajax_arr('未删除任何数据', FALSE);
    } else if (!$ret) {
      return ajax_arr('删除失败', FALSE);
    } else {
      return ajax_arr('删除' . $ret . '行数据', TRUE);
    }
  }
  
  function delete_by_func( $func_id ) {
    //DELETE FROM sys_role_permission WHERE opt_id IN ( SELECT id FROM sys_func_operation WHERE func_id = XXX )
    $SysRolePermission = M('SysRolePermission');
    
    $where['opt_id'] = array('exp' , 'in (SELECT id FROM sys_func_operation WHERE func_id = ' . $func_id  .') ');
    $ret = $SysRolePermission->where($where)->delete();
    
    if ($ret == 0) {
      return ajax_arr('未删除任何数据', FALSE);
    } else if (!$ret) {
      return ajax_arr('删除失败', FALSE);
    } else {
      return ajax_arr('删除' . $ret . '行数据', TRUE);
    }
  }


  /**
   * 更新角色权限
   * @param type $role_id
   * @param type $opt_id_arr
   * @return type
   */
  function update_role_permission( $role_id , $opt_id_arr ) {
    $SysRolePermission = M('SysRolePermission');
    
    //如果权限表为空 删除角色所有权限
    if( empty( $opt_id_arr ) ) {
      $ret = $SysRolePermission->where('role_id = %d' , $role_id )->delete();
      if ( $ret ) {
        return ajax_arr('更新权限成功', TRUE );
      } else {
        return ajax_arr('更新权限失败' );
      }
    }
    
    //如果原权限不在 新权限表中则删除
    $ret = ajax_arr('权限未更新');
    $old_data = $this->get_by_role_id($role_id);
    foreach ( $old_data as $row ) {
      if ( !in_array($row['opt_id'], $opt_id_arr) ) {
        //删除
        $delete_ret = $this->delete($row['id']);
        if( $delete_ret ) {
          $ret = ajax_arr('更新权限成功' , TRUE );
        }
      }
    }
    
    //如果有新的权限则添加
    foreach ( $opt_id_arr as $opt_id ) {
      $exist_opt = $this->get_by_role_opt($role_id, $opt_id);
      if ( empty( $exist_opt ) ) {
        $new_data = array(
          'role_id' => $role_id ,
          'opt_id' => $opt_id
        );
        $ret = $this->create($new_data);
      }
    }
    
    return $ret ;
  }
    
}
